package 纯数组;

public class No42接雨水 {

    /**
     * 面试题 17.21
     * 给定一个直方图(也称柱状图)，假设有人从上面源源不断地倒水，
     * 最后直方图能存多少水量?直方图的宽度为 1。
     * 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1]
     * 表示的直方图，在这种情况下，可以接 6 个单位的水（蓝色部分表示水）。 感谢 Marcos 贡献此图。
     *
     * 示例:
     * 输入: [0,1,0,2,1,0,1,3,2,1,2,1]
     * 输出: 6
     */

    public int trap(int[] height) {

        if(height.length<3){
            return 0;
        }

        int[] dpLeftMax=new int[height.length];
        int[] dpRightMax=new int[height.length];

        dpLeftMax[0]=-1;
        dpRightMax[height.length-1]=-1;

        int max=height[0];
        for (int i = 1; i < height.length; i++) {
            dpLeftMax[i]=max;
            max=Math.max(max,height[i]);
        }

        max=height[height.length-1];
        for (int i = height.length-1; i >= 0; i--) {
            dpRightMax[i]=max;
            max=Math.max(max,height[i]);
        }

        int result=0;
        for (int i = 1; i < height.length-1; i++) {

            int minHeight = Math.min(dpLeftMax[i], dpRightMax[i]);

            if(minHeight>height[i]){
                result+=(minHeight-height[i]);
            }
        }

        return result;
    }

}
